import datetime
from django.shortcuts import redirect, reverse
from django.utils.deprecation import MiddlewareMixin

from web import models
from django.conf import settings


class Tracer:
    def __init__(self):
        self.user = None
        self.price_policy = None
        self.project = None


class AuthMiddleware(MiddlewareMixin):

    def process_request(self, request):
        """ 如果用户已登陆，则request中赋值 """

        request.tracer = Tracer()

        user_id = request.session.get('user_id', 0)
        user_obj = models.UserInfo.objects.filter(pk=user_id).first()
        request.tracer.user = user_obj

        # 白名单：没有登录都可以访问的URL
        """
        1. 获取当用户访问的URL
        2. 检查URL是否在白名单中，如果在则可以继续向后访问，如果不在则进行判断是否已登录
        """
        if request.path_info in settings.WHITE_REGEX_URL_LIST:
            # 如果请求是NO_TRACER_URL_LIST中的，不管是否是登录状态都需要退出登录状态
            if request.path_info in settings.NO_TRACER_URL_LIST:
                if request.tracer.user:
                    # request.tracer=None只解决前端显示，如果要正在意义上的退出，
                    # 需要删除session中的user_id再设置request.tracer=None
                    request.tracer.user = None
            # 返回None或者不写None，都表示通过中间件了，继续往下走
            return None

        # 检查用户是否已登录，已登录继续往后走；未登录则返回登录页面。
        if not request.tracer.user:
            return redirect('/login/')

        # 登录成功之后，访问后台管理时：获取当前用户所拥有的额度

        # 方式一：免费额度在交易记录中存储
        # 获取当前用户并且是已支付的id值最大（最近交易记录）
        _object = models.Transaction.objects.filter(user=user_obj, status=1).order_by('-id').first()
        # 判断是否已过期
        current_datetime = datetime.datetime.now()
        if _object.end_datetime and _object.end_datetime < current_datetime:
            # 过期
            _object = models.Transaction.objects.filter(user=user_obj, status=1, price_policy__category=1).first()
        request.tracer.price_policy = _object.price_policy

        """
        # 方式二：免费的额度存储配置文件
        # 获取当前用户并且是已支付的id值最大（最近交易记录）
        _object = models.Transaction.objects.filter(user=user_obj, status=1).order_by('-id').first()
        if not _object:
            # 没有购买
            request.price_policy = models.PriceStrategy.objects.filter(category=1, title='个人免费版').first()
        else:
            # 付费版
            current_datetime = datetime.datetime.now()
            if _object.end_datetime and _object.end_datetime < current_datetime:
                # 过期
                request.price_policy = models.PriceStrategy.objects.filter(category=1, title='个人免费版').first()
            else:
                request.price_policy = _object.price_policy
        """

    def process_view(self, request, view, args, kwargs):
        """  """
        # 判断URL是否以manage开头，如果是则判断项目ID是否是我创建 or 参与

        # 不是以manage开头的，通过process_view往下走
        if not request.path_info.startswith('/manage/'):
            return
        # project_id 是我创建 or 我参与的
        project_id = kwargs.get('project_id')

        # 是否是我创建的
        project_create_obj = models.Project.objects.filter(
            creator=request.tracer.user,
            id=project_id,
        ).first()

        if project_create_obj:
            # 是我创建的项目的话，我就让他通过
            request.tracer.project = project_create_obj
            return

        # 是否是我参与的项目
        project_user_obj = models.Project.objects.filter(
            projectuser__user=request.tracer.user,
            id=project_id,
        ).first()

        if project_user_obj:
            # 是我参与的项目
            request.tracer.project = project_user_obj
            return

        return redirect(reverse('web:project_list'))
